/**
 * Author wln
 * Date 2020年11月24日10:17:33
 * Desc 常见表单验证，适用于element-ui -> form
 */

const validateRex = {
    // mobileReg: /^0{0,1}(13[0-9]|15[0-9]|17[0-9]|18[0-9])[0-9]{8}$/,
    mobileReg: /^0{0,1}1[0-9]{10}$/,
    phoneReg: /^0\d{2,3}-?\d{7,8}$/,
    emailReg: /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/,
    // passwordReg: /^[a-zA-Z\d_@.\!#\$%\^\&\*]{8,16}$/,
    passwordReg: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@!%*?&#._^])[A-Za-z\d$@!%*?&#._^]{8,16}$/,
    strongPasswordReg: /^(?=.*[a-zA-Z])(?=.*[0-9])[A-Za-z0-9]{8,}$/,
    idCardNoUtil: function (idcode) {
        // 加权因子
        var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        // 校验码
        var check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

        var code = idcode + ""
        var last = idcode[17]//最后一位

        var seventeen = code.substring(0, 17)

        // ISO 7064:1983.MOD 11-2
        // 判断最后一位校验码是否正确
        var arr = seventeen.split("")
        var len = arr.length
        var num = 0
        for (var i = 0; i < len; i++) {
            num = num + arr[i] * weight_factor[i]
        }

        // 获取余数
        var resisue = num % 11
        var last_no = check_code[resisue]

        // 格式的正则
        // 正则思路
        /*
        第一位不可能是0
        第二位到第六位可以是0-9
        第七位到第十位是年份，所以七八位为19或者20
        十一位和十二位是月份，这两位是01-12之间的数值
        十三位和十四位是日期，是从01-31之间的数值
        十五，十六，十七都是数字0-9
        十八位可能是数字0-9，也可能是X
        */
        var idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/

        // 判断格式是否正确
        var format = idcard_patter.test(idcode)

        // 返回验证结果，校验码和格式同时正确才算是合法的身份证号码
        return last === last_no && format ? true : false
    },
    checkIDCard: function (idcode) {
        // 加权因子
        var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        // 校验码
        var check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

        var code = idcode + ""
        var last = idcode[17]//最后一位

        var seventeen = code.substring(0, 17)

        // ISO 7064:1983.MOD 11-2
        // 判断最后一位校验码是否正确
        var arr = seventeen.split("")
        var len = arr.length
        var num = 0
        for (var i = 0; i < len; i++) {
            num = num + arr[i] * weight_factor[i]
        }

        // 获取余数
        var resisue = num % 11
        var last_no = check_code[resisue]

        // 格式的正则
        // 正则思路
        /*
        第一位不可能是0
        第二位到第六位可以是0-9
        第七位到第十位是年份，所以七八位为19或者20
        十一位和十二位是月份，这两位是01-12之间的数值
        十三位和十四位是日期，是从01-31之间的数值
        十五，十六，十七都是数字0-9
        十八位可能是数字0-9，也可能是X
        */
        var idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/

        // 判断格式是否正确
        var format = idcard_patter.test(idcode)

        // 返回验证结果，校验码和格式同时正确才算是合法的身份证号码
        return last === last_no && format ? true : false
    }
}

const ruleValidator = {

    /**
     * @use 联系电话
     * @param rule, value, callback
     * @returns callback
     */
    validateTelPhone(rule, value, callback) {
        if (value != '' && !validateRex.mobileReg.test(value) && !validateRex.phoneReg.test(value)) {
            callback(new Error('请输入正确的联系电话'))
        } else {
            callback()
        }
    },

    /**
     * @use 手机号码
     * @param rule, value, callback
     * @returns callback
     */
    validatePhone(rule, value, callback) {
        if (value != '' && !validateRex.mobileReg.test(value)) {
            callback(new Error('请输入正确的手机号码'))
        } else {
            callback()
        }
    },


    /**
     * @use 身份证号
     * @param rule, value, callback
     * @returns callback
     */
    validateIdCard(rule, value, callback) {
        if (value != '' && !validateRex.idCardNoUtil(value) && !validateRex.checkIDCard(value)) {
            callback(new Error('请输入正确的身份证号'))
        } else {
            callback()
        }
    },

    /**
     * @use 邮箱
     * @param rule, value, callback
     * @returns callback
     */
    validateEmail(rule, value, callback) {
        if (value != '' && !validateRex.emailReg.test(value)) {
            callback(new Error('请输入正确的邮箱地址'))
        } else {
            callback()
        }
    },

    /**
     * @use 密码
     * @param rule, value, callback
     * @returns callback
     */
    validatePassWord(rule, value, callback) {
        if (value.length > 0) {
            if (value.length < 8 || value.length > 16) {
                callback(new Error('密码长度应8-16位之间'))
            } else if (!validateRex.passwordReg.test(value)) {
                callback(new Error('密码必须包含大小写字母、数字及特殊字符'))
            } else {
                callback()
            }
        } else {
            callback('请输入密码')
        }
    },

    restrictInput(rule,value,callback) {
        if (value.length > 0) {
            var regex = /^[0-9a-zA-Z]+$/;
            if (!regex.test(value)) {
                callback(new Error('只能输入数字和字母'))
            }else{
                callback()
            }
        }else{
            callback('请输入信息')
        }
    },

    cylindersInput(rule,value,callback) {
        if (value.length > 0) {
            var regex = /^[0-9A-Z_-]+$/;
            if (!regex.test(value)) {
                callback(new Error('编号只能输入数字/大写字母及横线'))
            }else{
                callback()
            }
        }else{
            callback('编号只能输入数字/大写字母及横线')
        }
    },

    /**
     * @use 强密码
     * @param rule, value, callback
     * @returns callback
     */
    validateStrongPassWord(rule, value, callback) {
        if (value.length > 0) {
            if (value.length < 8) {
                callback(new Error('密码需大于8位'))
            } else if (!validateRex.strongPasswordReg.test(value)) {
                callback(new Error('密码需是数字和字母的组合'))
            } else {
                callback()
            }
        } else {
            callback('请输入密码')
        }
    }
}

export function validateStrongPassWord1(value, callback) {
    if (value.length > 0) {
        if (value.length < 8 || value.length > 16) {
            callback(('密码长度应8-16位之间'))
        } else if (!validateRex.passwordReg.test(value)) {
            callback(('密码必须包含大小写字母、数字及特殊字符'))
        } else {
            callback()
        }
    } else {
        callback('请输入密码')
    }
}

export default {validateRex, ruleValidator}

